package main

import "fmt"

// 发出叫声的东西
type Caller interface {
	Call() string
}

type Dog struct{}
type Cat struct{}

func (d *Dog) Call() string {
	return "Wang wang..."
}

// 我们故意让 Dog 的 Call 方法为指针接收器
// 而让 Cat 的 Call 方法为普通接收器
func (c Cat) Call() string {
	return "Mew mew..."
}

func AnimalCall(caller Caller) {
	fmt.Printf("This animal call: %s\n", caller.Call())
}

func main() {
	var d Dog
	var c Cat

	AnimalCall(&d)
	AnimalCall(c)
}
